namespace FIREFLYX {
    //常数定义
    //函数接口名-----------------------
    /** 开始函数名 */
    export const I_START_FUN = "start";
    /** 更新函数名 */
    export const I_UPDATE_FUN = "update";
    /** 稍后更新函数名 */
    export const I_LATE_UPDATE_FUN = "lateUpdate";
    /** 后渲染到纹理函数名 */
    export const I_ON_RENDER_IMAGE_FUN = "onRenderImage";

    /** 释放销毁接口 */
    export interface IDispose {
        /** 释放销毁 */
        dispose(): void;
        /** 已经被销毁 */
        get isDisposed(): boolean;
    }

    export interface IEnabled {
        /** 启用 */
        enabled: boolean;
    }

    /** 泛型数据 */
    export interface IDataGeneric<T> {
        /** event Data */
        data: T;
    }

    /** 事件监听器 */
    export interface IEventListener {
        /**
         * 添加事件监听
         * @param eventType 事件类型
         * @param listener  监听函数
         * @param thisArg   拥有函数的对象的this
         */
        addListener<K extends never>(eventType: K, listener: (ev: any) => any, thisArg: any): void;

        /**
         * 移除事件监听
         * @param eventType 事件类型
         * @param listener  监听函数
         * @param thisArg   拥有函数的对象的this
         */
        removeListener<K extends never>(eventType: K, listener: any, thisArg: any): void;

        /**
         * 派发事件
         * @param eventType 事件类型
         * @param ev        事件对象
         */
        dispatchEvent?<K extends never>(eventType: K, ev: any): boolean;

        /**
         * 指定事件监听者的数量
         * @param eventType 事件类型
         * @returns         指定事件类型监听的数量
         */
        listenerCount?<K extends never>(eventType: K): number;
    }

    /** 实例ID */
    export interface IInstanceID {
        /** 获取实例ID */
        getInstanceID(): number;
    }

    /** 渲染器 顶点数据结果 */
    export interface IRendererVDataResult {
        /** 材质的索引 */
        material: number;
        /**数据 长度  */
        lenght: number;
        /**element 类型  */
        elementType: number;
        /**缓冲区 偏移量(byte为单位)  */
        bufferOffset: number;
        /** 绘制模式  webgl的常量值 POINTS,LINES,TRIANGLES...  */
        drawMode: number;
        /** mesh 的正面连接顺序 webgl的常量值 CW 顺时针,CCW 逆时针 */
        frontFace: number;
    }

    /** 后渲染到纹理 */
    export interface IOnRenderImage {
        /**
         * 后渲染到纹理
         * @param src   渲染输入源rt  
         * @param dest  渲染后输出rt
         */
        onRenderImage(src: RenderTexture2D, dest: RenderTexture2D): void;
    }

    /** 内建uniform 变量 */
    export abstract class BuiltinUniform {
        /** 相机深度纹理 */
        public static readonly CAMERA_DEPTH_TEXTURE = "u_cameraDepthTexture";

    }
}
